use std::env;
use std::path::PathBuf;

fn main() {
    // 构建 C++ 库
    let dst = cmake::Config::new("cpp")
        .define("CMAKE_BUILD_TYPE", "Release")
        .build_target("cpp_utils")
        .no_build_target(true)
        .build();

    // 获取实际构建目录
    let build_dir = PathBuf::from(&dst).join("build");

    // 输出链接信息 - 添加多个可能的库路径
    println!("cargo:rustc-link-search=native={}/lib", build_dir.display());
    println!("cargo:rustc-link-search=native={}", dst.display());

    // 根据平台指定库名称
    if cfg!(target_os = "windows") {
        println!("cargo:rustc-link-lib=dylib=cpp_utils");
    } else if cfg!(target_os = "macos") {
        println!("cargo:rustc-link-lib=dylib=cpp_utils");
    } else {
        println!("cargo:rustc-link-lib=dylib=cpp_utils");
    }

    // 设置 bindgen 配置
    let bindings = bindgen::Builder::default()
        .header("cpp/include/math_utils.h")
        .header("cpp/include/string_utils.h")
        .header("cpp/include/geometry.h")
        .parse_callbacks(Box::new(bindgen::CargoCallbacks))
        // 允许使用 std::os::raw 中的类型
        .use_core()
        // 生成默认派生
        .derive_default(true)
        // 生成调试实现
        .derive_debug(true)
        // 处理多个头文件
        .clang_arg("-xc++")
        .clang_arg("-std=c++17")
        // 包含目录
        .clang_arg("-Icpp/include")
        .generate()
        .expect("Unable to generate bindings");

    // 输出绑定文件
    let out_path = PathBuf::from(env::var("OUT_DIR").unwrap());
    bindings
        .write_to_file(out_path.join("bindings.rs"))
        .expect("Couldn't write bindings!");
}
